#!/usr/bin/env python
# coding: utf-8

# # 日期：    
# 更新日期：11月（更新内容）     
# 撰写人：杨开泰   
# 
# -----
# 
# ## 课堂学习内容：
# 
# > * 1、高德API-WEB服务    
# > * 2、API经济成本的预估（调用量、并发量）   
# > * 3、地理编码
# ...
# 
# ## 课后练习：
# 
# > * 1、[地理编码](https://lbs.amap.com/api/webservice/guide/api/georegeo)   
# > * 2、[路径规划](http://lbs.amap.com/api/webservice/guide/api/direction)   
# ...

# In[4]:


### 准备工作


# In[5]:


import requests,json
import pandas as pd
key='18ef7dd6aeefc21dade574262c00f213'


# In[6]:


url='https://restapi.amap.com/v3/geocode/geo?parameters'


# In[7]:


#### 准备数据 请思考：高德API是怎么获取数据的？数据库查询
广州华广_address = "广东省广州市花都区华南理工大学广州学院"
广州花城_address = "广东省广州市花城广场"


# In[8]:


url = "https://restapi.amap.com/v3/geocode/geo?parameters"
params = {
    "key":key,
    "address":广州华广_address
}
# positional argument follows keyword argument
# pa 一定要放在前面，keyword argument放在末尾！！！可以
response = requests.get(url,params=params)
response


# In[9]:


response.json()


# In[10]:


广州华广_location = response.json()['geocodes'][0]['location']
广州华广_location


# In[ ]:





# In[11]:


def geocode(key,address,city=None,batch='false',sig=None,output='json',callback=None):
    url='https://restapi.amap.com/v3/geocode/geo?parameters'
    params={
    'key':key,
    'address':address,
    'city':city,
    'batch':batch,
    'sig':sig,
    'output':output,
    'callback':callback
    }
    response=requests.get(url,params=params)
    results=response.json()['geocodes'][0]['location']
    # return
    return results


# In[12]:


address1='广东省广州市花城广场'
广州花城_location=geocode(key,address1,city=None,batch='false',sig=None,output='json',callback=None)
广州花城_location


# ### 小结：

# ### 逆地理编码
# 
# > * A.url : https://restapi.amap.com/v3/geocode/regeo?parameters    
# > * B.requests.get()    
# > * C.参数：    
# 
# >> * 1、必选：key,location(经纬度坐标)
# >> * 2、可选: extensions[(默认：base)可选"all",描述数据详细指数]

# # 数据准备 广州华广_location

# In[13]:


# 逆地理编码函数
def regeo(key,location,extensions="base",radius=None,poitype=None):
    """"""
    url = "https://restapi.amap.com/v3/geocode/regeo?parameters"
    params = {
        "key":key,
        "location":location,
        "extensions":extensions,
        "radius":radius,
        "poitype":poitype
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[14]:


url = "https://restapi.amap.com/v3/geocode/regeo?parameters"
params = {
    "key":key,
    "location":广州华广_location,
    "extensions":"all"
}
r = requests.get(url,params)
r


# In[15]:


_roads_ = []
for item in r.json()['regeocode']['roads']:
#     print(item['name'])
    _roads_.append(item['name'])
_roads_


# In[16]:


r.json()


# In[17]:


pd.json_normalize(r.json()['regeocode']['pois'])


# ### 路径规划
# 
# > * 1、步行
# > * 2、公交车
# > * 3、驾车

# #### 步行 
# 
# > * 1、url:https://restapi.amap.com/v3/direction/walking?parameters    
# > * 2、requests.get()
# > * 3、参数：
# 
# >> * A.必选：key，origin（出发点（经度，纬度））,destination（目的地（经度，纬度））
# >> * B.可选：

# In[18]:


# 数据准备： 
origin = "广东省广州市中山大学南方学院"
destination = "广东省广州市花都区华南理工大学广州学院"


# In[19]:


# 思考：如果有1000个位置？重复代码？
# 函数！？ -->1、节省代码，重复利用  2、可以给小白（会一点python）用！
# 地理编码 =》 函数形式
# 函数一定不会报错，哪怕你写的语法有错误，哪怕你写的参数没定义？-----> 函数只有在执行（调用）时才会真正意义的运行！

def geocode(key,address,city=None,batch=None)->str:
    """获取高德API的地理编码
    注释：key是指高德API的秘钥，请先去注册
          address是指结构化地址，具体请查看：https://lbs.amap.com/api/webservice/guide/api/georegeo   
    """
    url = "https://restapi.amap.com/v3/geocode/geo?parameters"
    params = {
        "key":key,
        "address":address,
        "city":city,
        "batch":batch
    }
    response = requests.get(url,params=params)
    results = response.json()['geocodes'][0]['location']
    # 返回值
    return results
    


# In[20]:


起始点_中大南方 = geocode(key,origin)
起始点_中大南方


# In[21]:


目的地_广州华广 = geocode(key,destination)
目的地_广州华广


# In[22]:


# 步行
url = "https://restapi.amap.com/v3/direction/walking?parameters"
params = {
   "key":key,
   "origin":起始点_中大南方,
   "destination":目的地_广州华广
}
r = requests.get(url,params)
r


# In[23]:


r.json()['route']['paths']


# In[24]:


def walking(key,origin,location,sig=None,output='json',callback=None):
    url='https://restapi.amap.com/v3/direction/walking?parameters'
    params={
        'key':key,
        'origin':origin,
        'destination':location,
        'sig':sig,
        'output':output,
        'callback':callback,     
    }
    response=requests.get(url,params=params)
    results=response.json()
    return results


# In[25]:


origin='113.678600,23.633329'
location='113.172819,23.434030'
walking(key,origin,location,sig=None,output='json',callback=None)


# #### 学生练习（路径规划（公交车）（广州大学松田学院-->花城广场））：

# 
# 1.公交URL：https://restapi.amap.com/v3/direction/transit/integrated?parameters    
# 2.请求方式：request.get   
# 3.必填参数：key,origin,destination,city  

# #### 先找出两个地方的经纬度

# In[26]:


import requests,json
import pandas as pd
key='18ef7dd6aeefc21dade574262c00f213'


# In[27]:


url='https://restapi.amap.com/v3/geocode/geo?parameters'


# In[28]:


广大松田_address = "广东省广州市增城区广州大学松田学院"


# In[29]:


def geocode(key,address,city=None,batch='false',sig=None,output='json',callback=None):
   url='https://restapi.amap.com/v3/geocode/geo?parameters'
   params={
   'key':key,
   'address':address,
   'city':city,
   'batch':batch,
   'sig':sig,
   'output':output,
   'callback':callback
   }
   response=requests.get(url,params=params)
   results=response.json()['geocodes'][0]['location']
   # return
   return results


# In[30]:


address1='广东省广州市广州大学松田学院'
广大松田_location=geocode(key,address1,city=None,batch='false',sig=None,output='json',callback=None)
广大松田_location


# In[31]:


origin = '113.726044,23.277077'
destination =  '113.324596,23.119990'
city = "广州"


# In[32]:


广大松田_address = "广东省广州市广州大学松田学院"
花城广场_address = "广东省广州市花城广场"
def bus(key,origin,destination,city):
    z_url = "https://restapi.amap.com/v3/direction/transit/integrated?parameters"
    params = {
        "key":key,
        "origin":origin,
        "destination":destination,
        "city":city,
    }
    r = requests.get(z_url,params=params)
    result = r.json()
    return result


# In[33]:


a=bus(key,origin,destination,city)
a


# ### 行政区域查询
# > * 1、行政区域查询是一类简单的HTTP接口，根据用户输入的搜索条件可以帮助用户快速的查找特定的行政区域信息。
# > * 2、url:https://restapi.amap.com/v3/config/district?parameters 
# > * 3、requests.get()
# > * 4、适用场景：用户希望通过得到行政区域信息，进行开发工作。
# > * 5、参数：
# > * A.必选：key（高德API秘钥）
# > * B.可选：keywords（查询关键字），subdistrict（子级行政区，缺省值：1），page（需要第几页数据，缺省值：1），offset（最外层返回数据个数，缺省值：20），extensions（返回结果控制，默认值：base），filter（根据区划过滤），output（返回数据格式类型，缺省值：JSON），callback（回调函数）

# In[34]:


def district(key,keywords=None,subdistrict='1',page='1',offset='20',extensions='base',filter='',callback=None,output='json'):
   #行政区域查询
   url='https://restapi.amap.com/v3/config/district?parameters'
   params={
       'key':key,
       'keywords':keywords,
       'subdistrict':subdistrict,
       'extensions':extensions,
       'page':page,
       'offset':offset,
       'filter':filter,
       'callback':callback,
       'output':output     
   }
   response=requests.get(url,params)
   results=response.json()
   # return
   return results


# In[35]:


keywords='广东'
subdistrict='1'
district(key,keywords,subdistrict='1',page='1',offset='20',extensions='base',filter='',callback=None,output='json')


# In[36]:


a=district(key,keywords,subdistrict='1',page='1',offset='20',extensions='base',filter='',callback=None,output='json')['districts'][0]['districts']
import pandas as pd
pd.json_normalize(a)['name']


# ### 搜索POI
# > * 1、关键字搜索
# > * 2、周边搜索
# > * 3、多边形搜索
# > * 4、ID查询

# 
# #### 关键字搜索

# > *  1、url:https://restapi.amap.com/v3/place/text?parameters 
# > *  2、requests.get()
# > *  3、适用场景：通过用POI的关键字进行条件搜索，例如：肯德基、朝阳公园等；同时支持设置POI类型搜索，例如：银行。
# > *  4、参数：
# > *  A.必选：key，keyword（查询关键字），types（查询POI类型），(keywords和types两者至少必选其一)
# > *  B.可选：city（查询城市），citylimit（仅返回指定城市数据，缺省值：false），children（是否按照层级展示子POI数据，缺省值：0），offset（每页记录数据，缺省值：20），page（当前页数，缺省值：1），extensions（返回结果控制，默认值：base），sig（数字签名），output（返回数据格式类型，缺省值：JSON），callback（回调函数）

# In[37]:


def text(key,keywords=None,types=None,city=None,citylimit="false",children=0,offset=20,page=1,extensions="base",sig=None,output="JSON",callback=None):
   text_url = "https://restapi.amap.com/v3/place/text?parameters"
   params = {
       "key":key,
       "keywords":keywords,
       "types":types,
       "city":city,
       "citylimit":citylimit,
       "children":children,
       "offset":offset,
       "page":page,
       "extensions":extensions,
       "sig":sig,
       "output":output,
       "callback":callback
   }
   
   r = requests.get(text_url,params=params)
   result = r.json()
   return result


# In[38]:


g = text(key,keywords="美食",city="珠海市")
g


# ### 周边搜索
# > * 1、url:https://restapi.amap.com/v3/place/around?parameters 
# > * 2、requests.get()
# > * 3、适用场景：在用户传入经纬度坐标点附近，在设定的范围内，按照关键字或POI类型搜索。
# > * 4、参数：
# >> * A.必选：key，location
# >> * B.可选：keyword（查询关键字），types（查询POI类型），city（查询城市），radius（查询半径，缺省值：3000），sortrule（排序规则，缺省值：distance），offset（每页记录数据，缺省值：20），page（当前页数，缺省值：1），extensions（返回结果控制，默认值：base），sig（数字签名），output（返回数据格式类型，缺省值：JSON），callback（回调函数）

# In[ ]:


def around(location,keywords=''):
   #周边搜索
   url='https://restapi.amap.com/v3/place/around?parameters '
   key='18ef7dd6aeefc21dade574262c00f213'
   params={
       'key':key,
       'keywords':keywords,
       'location':location
     
   }
   response=requests.get(url,params)
   results=response.json()
   # return
   return results


# In[ ]:


keywords='电影院'
location='113.679287,23.632575'
around(location,keywords)


# ### 多边形搜索
# > * 1、url:https://restapi.amap.com/v3/place/polygon?parameters 
# > * 2、requests.get()
# > * 3、适用场景：在多边形区域内进行搜索。
# > * 4、参数：
# >> * A.必选：key，polygon（经纬度坐标对）
# >> * B.可选：keyword（查询关键字），types（查询POI类型），city（查询城市），offset（每页记录数据，缺省值：20），page（当前页数，缺省值：1），extensions（返回结果控制，默认值：base），sig（数字签名），output（返回数据格式类型，缺省值：JSON），callback（回调函数）

# In[ ]:


polygon="116.460988,40.006919|116.48231,40.007381;116.47516,39.99713|116.472596,39.985227|116.45669,39.984989|116.460988,40.006919"


# In[ ]:


def duobianxing(huang_key,polygon,keywords,types=None,city=None,offset=20,page=1,extensions="base",sig=None,output="JSON",callback=None):
    polygon_url = "https://restapi.amap.com/v3/place/polygon?parameters "
    params = {
        "key":huang_key,
        "polygon":polygon,
        "keywords":keywords,
        "types":types,
        "city":city,
        "offset":offset,
        "page":page,
        "extensions":extensions,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    
    r = requests.get(polygon_url,params=params)
    result = r.json()
    return result


# In[ ]:


zb = duobianxing(key,polygon,keywords="711")
zb


# In[ ]:


### ID查询
> * 1、url:https://restapi.amap.com/v3/place/detail?parameters 
> * 2、requests.get()
> * 3、适用场景：通过POI ID，查询某个POI详情，建议可同输入提示API配合使用。
> * 4、参数：
>> * A.必选：key，id（兴趣点ID）
>> * B.可选：sig（数字签名），output（返回数据格式类型，缺省值：JSON），callback（回调函数）


# In[ ]:


id = "B0FFFAB6J2"


# In[46]:


def detail(key,id,sig=None,output="JSON",callback=None):
   detail_url = "https://restapi.amap.com/v3/place/detail?parameters"
   params = {
       "key":key,
       "id":id,
       "sig":sig,
       "output":output,
       "callback":callback
   }
   
   r = requests.get(detail_url,params=params)
   result = r.json()
   return result


# In[47]:


j = detail(key,id)
j


# ### ip定位
# > * A.url : https://restapi.amap.com/v3/ip?parameters 
# > * B.requests.get()
# > * C.适用场景：希望能够将IP信息转换为地理位置信息。
# > * D.参数：
# 
#   >>* 1、必选：key（高德API秘钥）
#   >>* 2、可选:ip（ip地址），sig（数字签名），output（返回数据格式类型，缺省值：JSON）
# 

# In[54]:


ip = "114.247.50.2"


# In[55]:


def ip(key,ip,sig=None,output="JSON"):
    ip_url = "https://restapi.amap.com/v3/ip?parameters"
    params = {
        "key":key,
        "ip":ip,
        "sig":sig,
        "output":"json"
    }
    
    r = requests.get(ip_url,params=params)
    result = r.json()
    return result


# In[56]:


l = ip(key,ip)
l


# ### 静态地图

# > * A.url : https://restapi.amap.com/v3/staticmap?parameters 
# > * B.requests.get()
# > * C.截取图片呈现地理位置及周边信息
# > * D.参数：
# >> * 1、必选：key（高德API秘钥），location，zoom（地图级别）
# >> * 2、可选:size（地图大小，默认：400* 400），scale（普通/高清，默认：1），markers（标注），labels（标签），paths（折线），traffic（交通路况标识，缺省值：0），sig（数字签名

# In[58]:


from PIL import Image
from io import BytesIO
import requests

def static_map(key,location,zoom,size=None,scale=1,markers=None,labels=None,paths=None,traffic=0,page=None,sig=None):
    url = "https://restapi.amap.com/v3/staticmap?parameters"
    params = {
        "key":key,
        "location":location,
        "zoom":zoom,
        "size":size,
        "scale":scale,
        "markers":markers,
        "labels":labels,
        "paths":paths,
        "traffic":traffic,
        "sig":sig,
        "output":"json"
        }
    
    r = requests.get(url,params=params)
    data = Image.open(BytesIO(r.content))
    return data


# In[60]:


广州华广 = static_map(key,location="113.172819,23.434030",zoom=15)
广州华广


# ### 坐标转化
# 

# > * A.url : https://restapi.amap.com/v3/assistant/coordinate/convert?parameters 
# > * B.requests.get()
# > * C.适用场景：为了使用高德服务，用户需要将非高德坐标转换为高德坐标。
# > * D.参数：
#  >> * 1、必选：key（高德API秘钥），locations
#  >> * 2、可选:coordsys（原坐标系，缺省值：autonavi），sig（数字签名），output（返回数据格式类型，缺省值：JSON）

# In[61]:


locations = "116.481499,39.990475|116.481499,39.990375"


# In[62]:


def convert(key,locations,coordsys="autonavi",sig=None,output="JSON"):
    convert_url = " https://restapi.amap.com/v3/assistant/coordinate/convert?parameters"
    params = {
        "key":key,
        "locations":locations,
        "coordsys":coordsys,
        "sig":sig,
        "output":output
    }
    
    r = requests.get(convert_url,params=params)
    result = r.json()
    return result


# In[63]:


m = convert(key,locations,coordsys="gps")
m


# ### 天气查询

# > * A.url : https://restapi.amap.com/v3/weather/weatherInfo?parameters 
# > * B.requests.get()
# > * C.适用场景：需要使用相关天气查询的时候。
# > * D.参数：
#  >> * 1、必选：key（高德API秘钥），city
#  >>2、可选:extensions（气象类型,base:返回实况天气，all:返回预报天气），output（返回数据格式类型，缺省值：JSON）

# In[66]:


def weatherlnfo(key,city,extensions=None,output="JSON"):
    weatherlnfo_url = " https://restapi.amap.com/v3/weather/weatherInfo?parameters"
    params = {
        "key":key,
        "city":city,
        "extensions":extensions,
        "output":output
    }
    
    r = requests.get(weatherlnfo_url,params=params)
    result = r.json()
    return result


# In[67]:


k = weatherlnfo(key,city="增城",extensions="base")
k


# ### 输入提示

# > * A.url : https://restapi.amap.com/v3/assistant/inputtips?parameters 
# > * B.requests.get()
# > * C.适用场景：在高德客户端的使用场景，输入“关键字”之后出现提示相关。
# > * D.参数：
#  >> * 1、必选：key（高德API秘钥），keywords
#  >> * 2、可选:type（POI分类），location（坐标），city（搜索城市），citylimit（仅返回指定城市数据，缺省值：false），datatype（返回的数据类型，可选：all），sig（数字签名），output（返回数据格式类型，缺省值：JSON），callback（回调函数）

# In[73]:


def inputtips(key,keywords,type=None,location=None,city=None,citylimit="true",datatype="all",sig=None,output="JSON",callback=None):
    inputtips_url = "https://restapi.amap.com/v3/assistant/inputtips?parameters"
    params = {
        "key":key,
        "keywords":keywords,
        "type":type,
        "location":location,
        "city":city,
        "citylimit":citylimit,
        "datatype":datatype,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    
    r = requests.get(inputtips_url,params=params)
    result = r.json()
    return result


# In[76]:


o = inputtips(key,keywords="肯德基",city="珠海",datatype="all")
o


# ### 交通态势

# > * 1、矩形区域交通态势
# > * 2、圆形区域交通态势
# > * 3、指定路线交通态势
# > * 4、适用场景：希望能够确定矩形、圆形或某条道路的交通态势情况，路况信息2分钟更新一次。

# #### 矩形交通态势

# > * A.url : https://restapi.amap.com/v3/traffic/status/rectangle?parameters 
# > * B.requests.get()
# > * C.参数：
# >> * 1、必选：key（高德API秘钥），rectangle（代表此为矩形区域查询）
# >> * 2、可选:level（道路等级，默认值：5），extensions（返回结果控制，可选：base或all），sig（数字签名），output（返回数据格式类型，缺省值：JSON），callback（回调函数）

# In[81]:


rectangle = "113.679287,23.632575;113.677134,23.635678"


# In[82]:


def rectangle(key,rectangle,level=5,extensions="base",sig=None,output="JSON",callback=None):
    rectangle_url = "https://restapi.amap.com/v3/traffic/status/rectangle?parameters"
    params = {
        "key":key,
        "rectangle":rectangle,
        "level":level,
        "extensions":extensions,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    
    r = requests.get(rectangle_url,params=params)
    result = r.json()
    return result


# In[83]:


p = rectangle(key,rectangle)
p

